package com.example.synchronizedLearning;

public class Syn2 {

    public synchronized void printA() {
        System.out.println(Thread.currentThread().getName() + "- printA");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public synchronized void printB() {
        System.out.println(Thread.currentThread().getName() + "- printB");
    }

}

class Syn2Test {
    public static void main(String[] args) {

        /**
         * 同一个对象
         */
        Syn2 syn2 = new Syn2();

        Thread t1 = new Thread(syn2::printA);
        Thread t2 = new Thread(syn2::printB);

        t1.setName("t1");
        t2.setName("t2");

        /**
         * printA() 和 printB() 都被 synchronized 修饰。
         * t1 先获取对象锁并执行 printA()。
         * t2 必须等待 t1 释放锁后才能执行 printB()。
         */

        /**
         * ✅ "锁住当前对象" = 锁住对象头中的 Monitor
         * ✅ 锁住相同对象 → 线程互斥
         * ✅ 锁住不同对象 → 线程可并行
         */

        t1.start();
        t2.start();

        System.out.println(t1.getName() + ":" + t1.getState());
        System.out.println(t2.getName() + ":" + t2.getState());

    }
}
